from flask import Blueprint, jsonify, request #  request 可能在后续需要，先加上
from app.models.user import User
from app.models.device import Device
from app.models.user_device import UserDevice
from app.utils.auth import auth_required
from app.utils.logger import get_logger
# from app.models.mysql_db import db # 如果需要操作数据库会话，可能需要导入

logger = get_logger(__name__)

# 定义蓝图
user_bp = Blueprint('user', __name__, url_prefix='/api/users')

# 8. 获取用户列表
@user_bp.route('', methods=['GET']) # 对应 /api/users
@auth_required # 假设管理员权限
def get_all_users():
    """获取所有用户列表"""
    try:
        # 示例：增加分页功能
        page = request.args.get('page', 1, type=int)
        per_page = request.args.get('per_page', 10, type=int)
        
        pagination = User.query.paginate(page=page, per_page=per_page, error_out=False)
        users = pagination.items
        
        result = [
            {
                "id": user.id, 
                "username": user.username, 
                "email": user.email, 
                "nickname": user.nickname,
                "role": user.role, # 根据需要添加更多字段
                "created_at": user.created_at.isoformat() if user.created_at else None,
                "last_login": user.last_login.isoformat() if user.last_login else None
            }
            for user in users
        ]
        return jsonify({
            'code': 0, 
            'msg': 'success', 
            'data': {
                'items': result,
                'total': pagination.total,
                'page': pagination.page,
                'per_page': pagination.per_page,
                'pages': pagination.pages
            }
        })
    except Exception as e:
        logger.error(f"获取用户列表异常: {str(e)}")
        return jsonify({'code': 500, 'msg': f'服务器错误: {str(e)}', 'data': None}), 500

# 9. 获取用户的设备列表
@user_bp.route('/<int:userId>/devices', methods=['GET']) # 对应 /api/users/<userId>/devices, userId通常是整数
@auth_required
def get_user_devices(userId):
    """获取指定用户下的所有设备"""
    try:
        user = User.query.get(userId) # 使用 get() 更适合通过主键查询
        if not user:
            return jsonify({'code': 404, 'msg': '用户不存在', 'data': None}), 404

        # 权限检查逻辑 (如果需要，例如只允许用户查看自己的设备或管理员查看所有)
        # from flask import g
        # if g.user_id != userId and g.user_role != 'admin': # 假设g中存储了当前用户信息
        #     return jsonify({'code': 403, 'msg': '无权限访问该用户信息', 'data': None}), 403

        user_devices_links = UserDevice.query.filter_by(user_id=user.id).all()
        
        devices_info = []
        if user_devices_links:
            device_ids = [link.device_id for link in user_devices_links]
            if device_ids: # 确保 device_ids 不为空
                devices = Device.query.filter(Device.id.in_(device_ids)).all()
                devices_info = [
                    {
                        "id": dev.id, # 通常返回数据库中的设备主键 id
                        "deviceId": dev.device_id, # 设备自身的唯一标识符
                        "name": dev.name, 
                        "status": dev.status,
                        "model": dev.model, # 根据需要添加更多字段
                        "bound_at": link.created_at.isoformat() if hasattr(link, 'created_at') and link.created_at else None # 假设UserDevice有绑定时间
                    }
                    for dev in devices for link in user_devices_links if link.device_id == dev.id # 匹配绑定信息
                ]
        
        return jsonify({'code': 0, 'msg': 'success', 'data': devices_info})
    except Exception as e:
        logger.error(f"获取用户设备列表异常: {str(e)}")
        return jsonify({'code': 500, 'msg': f'服务器错误: {str(e)}', 'data': None}), 500

# 可以根据API文档添加更多用户相关的路由，例如：
# - 获取单个用户信息
# - 创建用户 (通常在 /api/auth/register 中实现)
# - 更新用户信息
# - 删除用户